package com.ruoyi.framework.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

/**
 * @author xudengyu
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {


    /**
     * 注册STOMP协议的端点（Endpoint）
     *
     * @param registry STOMP端点注册器
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")  // 定义WebSocket连接端点地址，前端通过该地址建立连接
                .setAllowedOriginPatterns("*"); // 允许所有来源的跨域请求（生产环境应限制具体域名）

        // 可选的附加配置：
        // .withSockJS();  // 启用SockJS回退选项（用于浏览器不支持WebSocket时自动降级）
    }

    /**
     * 配置消息代理（Message Broker）
     *
     * @param registry 消息代理注册器
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 启用一个简单的基于内存的消息代理（默认实现）
        // 代理将处理以"/topic"为前缀的目的地（Destination）
        registry.enableSimpleBroker("/topic");

        // 设置应用前缀，客户端发送消息到以"/app"开头的目的地
        // 这些消息将被路由到服务端的@MessageMapping注解方法
        registry.setApplicationDestinationPrefixes("/app");

        // 可选的附加配置（如使用外部消息代理RabbitMQ）：
        // registry.enableStompBrokerRelay("/topic", "/queue")
        //     .setRelayHost("localhost")
        //     .setRelayPort(61613)
        //     .setClientLogin("guest")
        //     .setClientPasscode("guest");
    }
}